﻿// ------------------------------------------------------------------------
// 项目名称：Canroc.Net 
// 版权归属：Canroc（https://gitee.com/canroc）
//
// 许可证信息
// Canroc.Net项目主要遵循 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-APACHE 文件。
//
// 使用条款：
// 1.使用本项目应遵守相关法律法规和许可证的要求。
// 2.不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动。
// 3.任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任
//
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
//
// 其他重要信息
// Canroc.Net 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// ------------------------------------------------------------------------

namespace Canroc.Net.SystemService.RedisService;

/// <summary>
///     Redis服务接口
/// </summary>
public interface IRedisService
{
    #region Base

    /// <summary>
    ///     判断Key值是否存在
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    Task<bool> ExistsAsync(string key);

    /// <summary>
    ///     key重命名
    /// </summary>
    /// <param name="key"></param>
    /// <param name="newKey"></param>
    /// <returns></returns>
    Task<bool> KeyRenameAsync(string key, string newKey);

    /// <summary>
    ///     设置缓存过期
    /// </summary>
    /// <param name="key"></param>
    /// <param name="datetime"></param>
    Task<bool> SetExpireAsync(string key, DateTime datetime);

    /// <summary>
    ///     删除key值
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    Task<bool> DeleteAsync(string key);

    /// <summary>
    ///     清除所有缓存
    /// </summary>
    /// <returns></returns>
    Task<int> DeleteAll();

    /// <summary>
    ///     获取第一个键
    /// </summary>
    /// <returns></returns>
    Task<string> GetFirstKeyAsync();

    /// <summary>
    ///     获取所有的Key值
    /// </summary>
    /// <returns></returns>
    Task<List<string>> GetAllKeyAsync();

    /// <summary>
    ///     获取第一个键(按照pattern匹配获取)
    /// </summary>
    /// <returns></returns>
    Task<string> GetFirstKeyAsync(string pattern);

    /// <summary>
    ///     获取所有的Key值(按照pattern匹配获取)
    /// </summary>
    /// <returns></returns>
    Task<List<string>> GetAllKeyAsync(string pattern);

    #endregion

    #region String

    /// <summary>
    ///     添加对象
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="key">键</param>
    /// <param name="obj">值</param>
    /// <param name="expire">过期时间，单位：分钟</param>
    /// <returns></returns>
    Task<bool> StringSetAsync<T>(string key, T obj, TimeSpan? expire = null);

    /// <summary>
    ///     批量添加
    /// </summary>
    /// <param name="keys">键</param>
    /// <param name="values">值</param>
    /// <returns></returns>
    Task<bool> StringSetAsync(string[] keys, string[] values);

    /// <summary>
    ///     获取多个
    /// </summary>
    /// <param name="keys">键</param>
    /// <returns></returns>
    Task<string?[]> StringGetAsync(string[] keys);

    /// <summary>
    ///     获取对象
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="key">键</param>
    /// <returns></returns>
    Task<T?> StringGetAsync<T>(string key);

    #endregion

    #region List

    /// <summary>
    ///     移除并返回存储在该键列表的第一个元素
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    Task<T?> ListLeftPopAsync<T>(string key);

    /// <summary>
    ///     移除并返回存储在该键列表的最后一个元素
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    Task<T?> ListRightPopAsync<T>(string key);

    /// <summary>
    ///     将值插入到key值的最左边
    /// </summary>
    /// <param name="key"></param>
    /// <param name="value"></param>
    /// <returns></returns>
    Task<long> ListLeftPushAsync<T>(string key, T value);

    /// <summary>
    ///     将值插入到key值的最右边
    /// </summary>
    /// <param name="key"></param>
    /// <param name="value"></param>
    /// <returns></returns>
    Task<long> ListRightPushAsync<T>(string key, T value);

    /// <summary>
    ///     返回列表长度
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    Task<long> ListLengthAsync(string key);

    /// <summary>
    ///     获取key值上的第一个数据
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="key"></param>
    /// <returns></returns>
    Task<T?> ListGetByIndexAsync<T>(string key);

    /// <summary>
    ///     返回在该列表上键所对应的元素
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    Task<List<T>> ListGetAll<T>(string key);

    #endregion

    #region Hash

    /// <summary>
    ///     判断某个数据是否已经被缓存
    /// </summary>
    Task<bool> HashExistsAsync(string key, string hashId);

    /// <summary>
    ///     存储数据到hash表
    /// </summary>
    Task<bool> HashSetAsync<T>(string key, string hashId, T value);

    /// <summary>
    ///     移除hash中的某值
    /// </summary>
    Task<bool> HashDeleteAsync(string key, string hashId);

    /// <summary>
    ///     从hash表获取数据
    /// </summary>
    Task<T?> HashGetAsync<T>(string key, string hashId);

    /// <summary>
    ///     获取整个hash的数据
    /// </summary>
    Task<Dictionary<string, T>?> HashGetAllAsync<T>(string key);

    #endregion

    #region Sorted Set

    /// <summary>
    ///     存储数据到sorted set表
    /// </summary>
    Task<bool> SortedSetAddAsync<T>(string key, T value, double score);

    /// <summary>
    ///     移除min和max之间的所有元素
    /// </summary>
    /// <returns></returns>
    Task<long> SortedSetRemoveRangeByScoreAsync(string key, double min, double max);

    #endregion
}